home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Developer / CIncludesTool 1.0 / original version / source files / dependencies.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-28  |  2.8 KB  |  137 lines  |  [TEXT/MPS ]

  1.  
  2. #include "CIncludesCode.h"
  3. #include <Memory.h>
  4. #include <StdIO.h>
  5.  
  6.  
  7. extern long            numFiles;
  8. extern ptrArray        *argvPtr;
  9. extern strArray     **filesHdl;
  10. extern Handle        dependencies;
  11.  
  12. Handle                tempDependencies;
  13.  
  14.  
  15.  
  16. Boolean isDependent( char *depPtr, short oldFile, short newFile )
  17. { // true if oldFile dependent on newFile
  18.  
  19.     return ( (Boolean) (*(depPtr + (oldFile * numFiles) + newFile )) );
  20. }
  21.  
  22.  
  23. void setDependency( Handle depHdl, short oldFile, short newFile, Boolean value )
  24. {
  25.     *(*depHdl + (oldFile * numFiles) + newFile ) = (char) value;
  26. }
  27.  
  28.  
  29. long nextInclude( Handle dataHdl, long pos, long limit )
  30. { // returns offset of next #include filename
  31.  
  32.     char *p = StripAddress( *dataHdl + pos );
  33.     char *q = StripAddress( *dataHdl + limit );
  34.     char ch;
  35.  
  36.     while ( p < q )
  37.     {
  38.         ch = *p++;
  39.         if ( ch == '#' )
  40.             if ( isString( p, "include" ) )
  41.                 return ( (long) (p - StripAddress( *dataHdl )) );
  42.             else
  43.                 while ( (*p++ != '\n') && (p < q) ) ;
  44.         else if ( ch > ' ' )
  45.             while ( (*p++ != '\n') && (p < q) ) ;
  46.     }
  47.     return limit;
  48. }
  49.  
  50.  
  51. void extractFileName( char *dest, char *src )
  52. {
  53.     while ( (*src != '<') && (*src != '"') )
  54.         ++src;
  55.     ++src;
  56.     
  57.     while ( (*src != '>') && (*src != '"') )
  58.         *dest++ = *src++;
  59.     *dest = '\0';
  60. }
  61.  
  62.  
  63. void extractIncludes( Handle dataHdl, short curFile )
  64. {
  65.     long    pos = 0;
  66.     short    index = 0;
  67.     short   fileIndex;
  68.     long    limit = GetHandleSize( dataHdl ) - 1;
  69.     char    s[64];
  70.     
  71.     while ( (pos = nextInclude( dataHdl, pos, limit )) < limit )
  72.     {
  73.         extractFileName( s, (*dataHdl + pos) );
  74.  
  75.         if ( (fileIndex = getFileIndex( s )) != -1 )
  76.             setDependency( tempDependencies, curFile, fileIndex, true );
  77.     }
  78. }
  79.  
  80.  
  81. void expandDependencies( short curExpanded, short curFile )
  82. {
  83.     short    i;
  84.     
  85.     setDependency( dependencies, curExpanded, curFile, true );
  86.     
  87.     for ( i = 0; i < numFiles; ++i )
  88.         if ( isDependent( *tempDependencies, curFile, i ) &&
  89.             !isDependent( *dependencies, curExpanded, i ) )
  90.           expandDependencies( curExpanded, i );              // recursion
  91. }
  92.  
  93.  
  94. void makeDependencyArray()
  95. {
  96.     short    i;
  97.     Handle    dataHdl;
  98.     
  99.     fprintf( stderr, "Collecting \"#Includes\" data...\n" );
  100.  
  101.     tempDependencies = NewHandleClear( numFiles * numFiles );
  102.         checkMemory();
  103.  
  104.     for ( i = 0; i < numFiles; ++i )
  105.     {
  106.         dataHdl = loadDataFile( (*argvPtr)[i+2] );
  107.         extractIncludes( dataHdl, i );
  108.         DisposHandle( dataHdl );
  109.     }
  110.  
  111.     fprintf( stderr, "Calculating dependency array...\n" );
  112.  
  113.     dependencies = NewHandleClear( numFiles * numFiles );
  114.         checkMemory();
  115.  
  116.     for ( i = 0; i < numFiles; ++i )
  117.         expandDependencies( i, i );
  118.  
  119.     DisposHandle( tempDependencies );
  120. }
  121.  
  122.  
  123. void printDependencyArray()  /* 12-page printout of filesnames and dependencies */
  124. {
  125.     short i, j;
  126.     
  127.     fprintf( stderr, "\n" );
  128.  
  129.     for ( i = 0; i < numFiles; ++i )
  130.     {
  131.         fprintf( stderr, "\nfile: %s\n", (**filesHdl)[i] );
  132.         for ( j = 0; j < numFiles; ++j )
  133.             if (isDependent( *dependencies, i, j ) )
  134.                 fprintf( stderr, "%s\n", (**filesHdl)[j] );
  135.     }
  136. }
  137.